#!/usr/bin/make -f
# debian/rules for the Debian mesa package
# Copyright © 2006 Thierry Reding <thierry@gilfi.de>

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
DEB_HOST_ARCH      ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_ARCH_OS   ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
DEB_HOST_ARCH_CPU  ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)

ifeq (,$(filter $(DEB_HOST_ARCH), armhf sh3 sh4))
buildflags = \
	$(shell DEB_CFLAGS_MAINT_APPEND=-Wall DEB_CXXFLAGS_MAINT_APPEND=-Wall dpkg-buildflags --export=configure)
else
  ifneq (,$(filter $(DEB_HOST_ARCH), armhf))
  # Workaround for a variant of LP: #725126
  buildflags = \
	$(shell DEB_CFLAGS_MAINT_APPEND="-Wall -fno-optimize-sibling-calls" DEB_CXXFLAGS_MAINT_APPEND="-Wall -fno-optimize-sibling-calls" dpkg-buildflags --export=configure)
  else
  # Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83143
  buildflags = \
	$(shell DEB_CFLAGS_MAINT_APPEND="-Wall -O1" DEB_CXXFLAGS_MAINT_APPEND="-Wall -O1" dpkg-buildflags --export=configure)
  endif
endif

# keep a list of files we don't install (yet), but since it's a bit
# large, use an external file:
include debian/not-installed

DRI_DRIVERS =
GALLIUM_DRIVERS =
VULKAN_DRIVERS =

confflags_DRI3 = --disable-dri3

# hurd doesn't do direct rendering
ifeq ($(DEB_HOST_ARCH_OS), hurd)
	EGL_PLATFORMS = x11

	confflags_DIRECT_RENDERING = --disable-driglx-direct
	confflags_GBM = --disable-gbm
	DRI_DRIVERS = swrast
	with_libva = 
else
	EGL_PLATFORMS = x11,surfaceless

  ifeq ($(DEB_HOST_ARCH_OS), linux)
	confflags_DRI3 = --enable-dri3
	# Gallium drivers which require kernel support, not yet ported to non-Linux
	GALLIUM_DRIVERS += nouveau virgl

	# Freedreno requires arm in addition
	ifneq (,$(filter arm arm64,$(DEB_HOST_ARCH_CPU)))
		GALLIUM_DRIVERS += freedreno
	endif

	# tegra and vc4 kernel support are only available on armhf and arm64
	ifneq (,$(filter $(DEB_HOST_ARCH), armhf arm64))
		GALLIUM_DRIVERS += tegra vc4
	endif

	# etnaviv kernel support is currently only available on armhf
	ifneq (,$(filter $(DEB_HOST_ARCH), armhf))
		GALLIUM_DRIVERS += etnaviv imx
	endif

	ifneq (,$(filter $(DEB_HOST_ARCH), amd64 i386 x32))
		GALLIUM_DRIVERS += svga
		# svga needs xa state tracker
		confflags_GALLIUM += --enable-xa
		VULKAN_DRIVERS += intel
	endif

	# Non-Linux ports also lack *_CLOEXEC and epoll, so wayland isn't ready yet:
	EGL_PLATFORMS += wayland

	ifeq (,$(filter $(DEB_HOST_ARCH), s390 s390x))
		DRI_DRIVERS += nouveau
	endif
  endif

	EGL_PLATFORMS += drm

  # Build intel drivers on archs where libdrm-intel is installed
  ifneq (,$(filter $(DEB_HOST_ARCH),amd64 i386 kfreebsd-amd64 kfreebsd-i386 x32))
	DRI_DRIVERS += i915 i965
  endif

  ifeq (,$(filter $(DEB_HOST_ARCH), s390 s390x))
	DRI_DRIVERS += r200 radeon
	GALLIUM_DRIVERS += r600 r300
  endif

  # LLVM is required for building r300g, radeonsi and llvmpipe drivers.
  # It's also required for building OpenCL support.
  ifneq (,$(filter $(DEB_HOST_ARCH), amd64 arm64 armel armhf i386 kfreebsd-amd64 kfreebsd-i386 mips mips64el mipsel powerpc ppc64 sparc64 ppc64el))
	GALLIUM_DRIVERS += radeonsi
	confflags_GALLIUM += --enable-llvm
	confflags_GALLIUM += --enable-opencl --enable-opencl-icd
	confflags_GALLIUM += ac_cv_path_LLVM_CONFIG=llvm-config-6.0
	GALLIUM_DRIVERS += swrast
  else
	DRI_DRIVERS += swrast
	confflags_GALLIUM += --disable-llvm
  endif

  # radv needs LLVM and the Vulkan loader, so only build on the subset of
  # arches where we have LLVM enabled and where the Vulkan loader is built.
  ifneq (,$(filter $(DEB_HOST_ARCH), amd64 arm64 armel armhf i386 mips mips64el mipsel powerpc ppc64 sparc64 ppc64el))
	VULKAN_DRIVERS += radeon
  endif

	confflags_DIRECT_RENDERING = --enable-driglx-direct
	confflags_GBM = --enable-gbm
	confflags_GALLIUM += --enable-vdpau
	confflags_GALLIUM += --enable-va
	confflags_GALLIUM += --enable-gallium-extra-hud
	confflags_GALLIUM += --enable-lmsensors
	with_libva = ,libva
endif

# Disable assembly usage on x32 otherwise Mesa defaults to x86_64 assembly
# which doesn't work on x32 (see #758094)
ifneq (,$(filter $(DEB_HOST_ARCH), x32))
	confflags += --disable-asm
endif

confflags_EGL = --with-platforms="$(EGL_PLATFORMS)"
confflags_GLES = --disable-gles1 --enable-gles2
confflags_GALLIUM += --with-gallium-drivers="$(GALLIUM_DRIVERS)"

confflags += \
	--enable-dri \
	--with-dri-drivers="$(DRI_DRIVERS)" \
	--with-dri-driverdir=/usr/lib/$(DEB_HOST_MULTIARCH)/dri \
	--with-dri-searchpath='/usr/lib/$(DEB_HOST_MULTIARCH)/dri:\$$$${ORIGIN}/dri:/usr/lib/dri' \
	--with-vulkan-drivers="$(VULKAN_DRIVERS)" \
	--enable-libglvnd \
	--enable-osmesa \
	--enable-glx-tls \
	--enable-shared-glapi \
	--enable-texture-float \
	--disable-xvmc \
	--disable-omx-bellagio \
	$(confflags_DIRECT_RENDERING) \
	$(confflags_GBM) \
	$(confflags_DRI3) \
	$(confflags_EGL) \
	$(confflags_GALLIUM) \
	$(confflags_GLES) \
	$(buildflags)

override_dh_clean:
	rm -rf .pc
	rm -rf build
	rm -rf configure bin/config.guess bin/config.sub config.h.in
	rm -rf $$(find -name Makefile.in)
	rm -rf bin/install-sh bin/ltmain.sh
	for file in debian/*.in; do rm -f $${file%%.in}; done
	rm -f src/amd/vulkan/*.pyc
	rm -f src/compiler/nir/*.pyc
	rm -f src/egl/generate/*.pyc
	rm -f src/intel/vulkan/*.pyc
	rm -f src/mapi/glapi/gen/*.pyc
	rm -f src/mesa/main/*.pyc
	rm -f src/gallium/auxiliary/util/*.pyc

	dh_clean

override_dh_auto_configure:
	dh_auto_configure -- \
		$(confflags)

override_dh_auto_install:
	dh_auto_install
	for file in debian/*.in; \
	do \
		sed -e"s,\$${DEB_HOST_MULTIARCH},$(DEB_HOST_MULTIARCH),g" \
			$${file} > $${file%%.in}; \
	done

override_dh_auto_test:

allpkg = $(shell dh_listpackages -a)

override_dh_installchangelogs:
	dh_installchangelogs -a
	dh_installchangelogs -pmesa-common-dev

override_dh_install:
	# Also get rid of other files which aren't installed. Do not
	# use -f to ensure we notice disappearing files:
	set -e; for file in $(NOT_INSTALLED); do rm debian/tmp/$$file; done
	# Files only in git, not in tarballs, OK to use rm -f here:
	set -e; for file in $(NOT_INSTALLED_EITHER); do rm -f debian/tmp/$$file; done
	# purge .la files
	find debian/tmp/ -name '*.la' -exec rm '{}' ';'

	# GLESv2 libs still get built for some reason
	rm -f debian/tmp/usr/lib/*/libGLESv2*
	# these are not needed
	rm -f debian/tmp/usr/lib/*/libEGL_mesa.so
	rm -f debian/tmp/usr/lib/*/libGLX_mesa.so

	# Drop libwayland-egl which is provided by src:wayland now
	rm -f debian/tmp/usr/lib/*/libwayland-egl.so*
	rm -f debian/tmp/usr/lib/*/pkgconfig/wayland-egl.pc

	# Copy the hardlinked *_dri.so correctly.
	install -m755 -d debian/libgl1-mesa-dri/usr/lib/${DEB_HOST_MULTIARCH}/dri/
	mv debian/tmp/usr/lib/${DEB_HOST_MULTIARCH}/dri/*_dri.so \
	   debian/libgl1-mesa-dri/usr/lib/${DEB_HOST_MULTIARCH}/dri/

  # Remove vulkan headers only where they get installed in tmp
  # We ship those headers via src:vulkan / libvulkan-dev
  ifneq (,$(filter $(DEB_HOST_ARCH),amd64 i386 x32))
	rm debian/tmp/usr/include/vulkan/vulkan_intel.h
	rmdir debian/tmp/usr/include/vulkan
  endif

  ifneq ($(DEB_HOST_ARCH_OS), hurd)
	# Copy the hardlinked vdpau drivers correctly.
	install -m755 -d debian/mesa-vdpau-drivers/usr/lib/${DEB_HOST_MULTIARCH}/vdpau/
	mv debian/tmp/usr/lib/${DEB_HOST_MULTIARCH}/vdpau/libvdpau*.so* \
	   debian/mesa-vdpau-drivers/usr/lib/${DEB_HOST_MULTIARCH}/vdpau/

	# Copy the hardlinked va drivers correctly.
	install -m755 -d debian/mesa-va-drivers/usr/lib/${DEB_HOST_MULTIARCH}/dri/
	mv debian/tmp/usr/lib/${DEB_HOST_MULTIARCH}/dri/*_drv_video.so \
	   debian/mesa-va-drivers/usr/lib/${DEB_HOST_MULTIARCH}/dri/
  endif

	dh_install -a --fail-missing

	# Install bug control and script:
	set -e; for p in $(allpkg); do \
		install -d debian/$$p/usr/share/bug/$$p && \
		install -m 644 debian/local/control debian/$$p/usr/share/bug/$$p && \
		install -m 755 debian/local/script  debian/$$p/usr/share/bug/$$p; \
	done

override_dh_makeshlibs:
	dh_makeshlibs -a -- -c4

%:
	dh $@ --with quilt,autoreconf$(with_libva) \
		--parallel \
		--builddirectory=build/

# For maintainer use only, generate a tarball:
gentarball: SOURCE=mesa
gentarball: UV=$(shell dpkg-parsechangelog|awk '/^Version:/ {print $$2}'|sed 's/-.*$$//')
gentarball:
	git archive --format=tar upstream-experimental --prefix=$(SOURCE)-$(UV)/ | gzip -9 > ../$(SOURCE)_$(UV).orig.tar.gz
